面向对象编程
1. 封装
2. 继承
- 父类中私有的变量或方法不会被子类继承。
- 子类会继承父类的所有方法。
2.1. super关键字
使用
super
关键字访问父类的成员变量或方法,使用this
关键字访问本类的成员变量或方法。当子类的对象被创建时,在调用无参构造器的时候,默认会先调用父类的无参构造器,再执行子类的无参构造器。
public Son(){ super(); // 此为默认隐藏代码,可手动敲出,但必须在方法体内的第一行 // ... }
父类没有无参构造器时,子类也没有无参构造器。无法被无参实例化,需要重写
super()
方法指向有参构造器。super
和this
不能同时调用构造方法。super
只能出现在子类的方法或者构造器中,只有继承条件才可以使用。
2.2. 方法重载
- 重写需要有继承关系,子类重写父类方法。
- 方法名必须相同。
- 参数列表必须相同。
- 修饰符的范围可以扩大但不能缩小。
- 抛出的异常可以被缩小,但不能被扩大。
- 为什么需要重写?
- 父类的功能,子类不一定需要或不一定满足。
3. 多态
里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。父类引用可以指向子类对象。即
父类 变量名 = new 子类()
。总结:静态方法(.)看左边,动态方法(new)看右边。
// B类 extends A类
/*
public static void test(){
System.out.println("B");
}
*/
A a = new A();
a.test(); // A
B b = new B();
b.test(); // B
A c = new B();
c.test(); // A
/*
public void test(){
System.out.println("B");
}
*/
A a = new A();
a.test(); // A
B b = new B();
b.test(); // B
A c = new B();
c.test(); // B
- 指向子类的父类无法调用子类特有的方法,但可以通过强制类型转换实现。
- 对象能执行哪些方法看左边,和右边关系不大。
- 子类转父类,可能丢失自己本来的一些方法。
3.1. 不能重写的方法
- static方法:属于类,不属于实例。
- final:常量。
- private方法。